package com.shujia

object Demo16Implicit01 {
  def main(args: Array[String]): Unit = {
    /**
     * 隐式转换：动态给对象（变量）增加方法的一种方式
     * 在Scala中有些事情不需要自己去做，可以交由编译器自动完成
     *
     * 在Scala中隐式转换可以分为三类：
     * 1、隐式转换函数
     * 2、隐式转换变量
     * 3、隐式转换类
     */

    // 1、隐式转换函数
    // Int => Unit
    def func1(int: Int): Unit = {
      println(int + 100)
    }

    func1(100) // 200
    func1(200) // 300

    // 由于Scala是静态数据类型的编程语言，在传入参数时会检查类型是否匹配
    //    func1("300")
    // 如果需要传入字符串，则可以手动的进行类型转换
    //    func1("300".toInt) // toInt方法也是通过隐式转换添加的，会和自己定义隐式转换函数冲突
    func1(Integer.parseInt("300"))

    implicit def str2Int(str: String): Int = {
      Integer.parseInt(str)
    }

    func1(str2Int("500")) // 直接调用方法
    func1("500") // 让编译器自动调用
  }

}
